package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;

import co.gov.medellin.ssti.sub.model.dao.IAtributosDAO;
import co.gov.medellin.ssti.sub.model.dao.exception.DAOException;
import co.gov.medellin.ssti.sub.model.vo.AtributoVO;
import co.gov.medellin.ssti.sub.model.vo.ValorFlexibleVO;

public class AtributosDAOImpl extends BaseDAOImpl implements IAtributosDAO {

	private static final String FIND_ATR_SUBPROGRAMA_EG_BY_SUBP_COD = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
			+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
			+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
			+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
			+ " WHERE UPPER(TRIM(NOMBRE)) = 'GESTOR' AND SBPR_CODIGO = ?";

	private static final String SELECT_MAX_COD_BEN_RESTRICCION = " SELECT MAX(CODIGO)CODIGO FROM TCS_BEN_RESTRICCION";
	private static final String VALOR_CAR_ATR = "VALOR_CAR_ATR";
	private static final String VALOR_NUM_ATR = "VALOR_NUM_ATR";
	private static final String VALOR_FEC_ATR = "VALOR_FEC_ATR";

	// Constructor
	public AtributosDAOImpl(Connection con) {
		super(con);
	}

	public Collection<AtributoVO> findAtributosSubprograma(
			Long codeSubprograma, String vigencia, int opcion)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "";
		if (opcion == 0) {
			query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
					+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = ? AND VIGENCIA = ? "
					+ " ORDER BY ORDEN ";
		} else {
			query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
					+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
					+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
					+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
					+ " WHERE SBPR_CODIGO = ? AND VIGENCIA = ? "
					+ " AND REST_CODIGO IS NULL ORDER BY ORDEN ";
		}
		ArrayList<AtributoVO> atributos = new ArrayList<AtributoVO>();
		try {
			System.out.println("query: " + query);
			System.out.println("sbpr_codigo: " + codeSubprograma.longValue());
			System.out.println("vigencia: " + vigencia);
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeSubprograma.longValue());
			pstmt.setString(2, vigencia);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				AtributoVO atr = new AtributoVO();
				atr.setCodigo(rst.getString("CODIGO"));
				atr.setCodatributo(rst.getString("CODIGO"));
				atr.setTipoatributo(rst.getString("TIPO_ATRIBUTO"));
				atr.setNombre(rst.getString("NOMBRE"));
				atr.setRestriccion(rst.getString("REST_CODIGO"));
				atr.setOrden(rst.getString("ORDEN"));
				atr.setLongitud(rst.getString("LONGITUD"));
				atr.setObligatorio(rst.getString("OBLIGATORIO"));
				atr.setEtiqueta(rst.getString("ETIQUETA"));
				atr.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				atr.setValLista(rst.getString("VALIDAR_LISTA"));
				atr.setVigencia(rst.getString("VIGENCIA"));
				atr.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));
				atr.setDescripcion(rst.getString("DESCRIPCION"));
				atr.setTipodato(rst.getString("TIPO_DATO"));
				String strdominio = rst.getString("VALIDAR_LISTA");
				if (strdominio.equals("S")) {
					atr.setValoresflexibles(llenarLista(atr));
					// wtf?
					// String strVS = rst.getString("VALOR_SUGERIDO");
					atr.setDesvalorsugerido(getDesVFL(atr));
				}
				atributos.add(atr);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return atributos;
	}

	public AtributoVO findAtributoEGSubprograma(Long codeSubprograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		AtributoVO atr = null;
		try {
			pstmt = conn.prepareStatement(FIND_ATR_SUBPROGRAMA_EG_BY_SUBP_COD);
			pstmt.setLong(1, codeSubprograma.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				atr = new AtributoVO();
				atr.setCodigo(rst.getString("CODIGO"));
				atr.setCodatributo(rst.getString("CODIGO"));
				atr.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				atr.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));
				String strdominio = rst.getString("VALIDAR_LISTA");
				if (strdominio.equals("S")) {
					atr.setValoresflexibles(llenarLista(atr));
					atr.setDesvalorsugerido(getDesVFL(atr));
				}
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return atr;
	}

	public AtributoVO findAtributoByCodigoAndVigencia(Long codigoAtributo,
			String vigencia) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
				+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
				+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
				+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " WHERE CODIGO = ? AND VIGENCIA = ? ";

		AtributoVO atr = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codigoAtributo.longValue());
			pstmt.setString(2, vigencia);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				atr = new AtributoVO();
				atr.setCodigo(rst.getString("CODIGO"));
				atr.setCodatributo(rst.getString("CODIGO"));
				atr.setTipoatributo(rst.getString("TIPO_ATRIBUTO"));
				atr.setNombre(rst.getString("NOMBRE"));
				atr.setRestriccion(rst.getString("REST_CODIGO"));
				atr.setOrden(rst.getString("ORDEN"));
				atr.setLongitud(rst.getString("LONGITUD"));
				atr.setObligatorio(rst.getString("OBLIGATORIO"));
				atr.setEtiqueta(rst.getString("ETIQUETA"));
				atr.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				atr.setValLista(rst.getString("VALIDAR_LISTA"));
				atr.setVigencia(rst.getString("VIGENCIA"));
				atr.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));
				atr.setDescripcion(rst.getString("DESCRIPCION"));
				atr.setTipodato(rst.getString("TIPO_DATO"));
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return atr;
	}

	public AtributoVO findAtributoByCodigo(Long codigoAtributo)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT CODIGO, TIPO_ATRIBUTO, NOMBRE, REST_CODIGO, ORDEN, LONGITUD, "
				+ " OBLIGATORIO, ETIQUETA, VALOR_SUGERIDO, VALIDAR_LISTA, "
				+ " VIGENCIA, TTVF_CODIGO_DOMINIO, DESCRIPCION, TIPO_DATO "
				+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE CODIGO = ? ";
		// + CodigoAtri + " ";
		AtributoVO atr = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codigoAtributo.longValue());
			System.out.println(codigoAtributo);
			System.out.println("Query: " + query);
			rst = pstmt.executeQuery();
			while (rst.next()) {
				atr = new AtributoVO();
				atr.setCodigo(rst.getString("CODIGO"));
				atr.setCodatributo(rst.getString("CODIGO"));
				atr.setTipoatributo(rst.getString("TIPO_ATRIBUTO"));
				atr.setNombre(rst.getString("NOMBRE"));
				atr.setRestriccion(rst.getString("REST_CODIGO"));
				atr.setOrden(rst.getString("ORDEN"));
				atr.setLongitud(rst.getString("LONGITUD"));
				atr.setObligatorio(rst.getString("OBLIGATORIO"));
				atr.setEtiqueta(rst.getString("ETIQUETA"));
				atr.setValorsugerido(rst.getString("VALOR_SUGERIDO"));
				atr.setValLista(rst.getString("VALIDAR_LISTA"));
				atr.setVigencia(rst.getString("VIGENCIA"));
				atr.setTipovalorflex(rst.getString("TTVF_CODIGO_DOMINIO"));
				atr.setDescripcion(rst.getString("DESCRIPCION"));
				atr.setTipodato(rst.getString("TIPO_DATO"));
			}
			if (codigoAtributo.longValue() == 1234) {
				atr = new AtributoVO();
				atr.setCodigo("1234");
				atr.setCodatributo("1234");
				atr.setTipoatributo("B");
				atr.setNombre("TERCERO");
				atr.setRestriccion("");
				atr.setOrden("35");
				atr.setLongitud("200");
				atr.setObligatorio("N");
				atr.setEtiqueta("TERCERO");
				atr.setValorsugerido("");
				atr.setValLista("N");
				atr.setVigencia("A");
				atr.setTipovalorflex("");
				atr.setDescripcion("");
				atr.setTipodato("A");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return atr;
	}

	public int findMaxCodigoRestriccion() throws DAOException {
		Statement st = null;
		ResultSet rst = null;

		int codigo = 0;
		try {
			st = conn.createStatement();
			rst = st.executeQuery(SELECT_MAX_COD_BEN_RESTRICCION);
			while (rst.next()) {
				codigo = rst.getInt("CODIGO");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, st);
		}
		return codigo;
	}

	public int findAtributosValidarLista(Long codeSubprograma)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		int actualizarAtriVallista = 0;
		String query = "SELECT CODIGO, ETIQUETA, VALIDAR_LISTA "
				+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = ? "
				+ " AND TTVF_CODIGO_DOMINIO IS NULL "
				+ " AND VALIDAR_LISTA='S'";

		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeSubprograma.longValue());
			rst = pstmt.executeQuery();
			while (rst.next()) {
				Long codeAtri = new Long(rst.getLong("CODIGO"));
				actualizarAtriVallista = updateAtriValidarLista(
						codeSubprograma, codeAtri);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		return actualizarAtriVallista;
	}

	private Collection<ValorFlexibleVO> llenarLista(AtributoVO atr)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strCod = (String) atr.getTipovalorflex();
		int iCodTvfl = Integer.parseInt(strCod.trim());

		String query = "SELECT TCS_VALOR_FLEXIBLE.DESCRIPCION DESCRIPCIONVFL, TCS_VALOR_FLEXIBLE.CODIGO_VALOR CODIGOVFL "
				+ " FROM paoyer.TCS_VALOR_FLEXIBLE, paoyer.TCS_TIPO_VALOR_FLEX "
				+ " WHERE TCS_TIPO_VALOR_FLEX.CODIGO = ? "
				+ " AND TCS_VALOR_FLEXIBLE.TVF_CODIGO = ? "
				+ " AND TCS_VALOR_FLEXIBLE.VIGENCIA = 'S' "
				+ " ORDER BY TCS_VALOR_FLEXIBLE.DESCRIPCION";

		ArrayList<ValorFlexibleVO> valorflex = new ArrayList<ValorFlexibleVO>();
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, iCodTvfl);
			pstmt.setInt(2, iCodTvfl);
			rst = pstmt.executeQuery();

			while (rst.next()) {
				ValorFlexibleVO vfl = new ValorFlexibleVO();
				// vfl.setCodigovfl(codigovfl);
				vfl.setDescripcionvf(rst.getString("DESCRIPCIONVFL"));
				Object obval = (Object) rst.getString("CODIGOVFL");
				if (obval != null) {
					vfl.setCodigovfl(rst.getString("CODIGOVFL"));
					vfl.setDescripciontvfl(rst.getString("DESCRIPCIONVFL"));
				} else {
					vfl.setCodigovfl(rst.getString("DESCRIPCIONVFL"));
					vfl.setDescripciontvfl(rst.getString("DESCRIPCIONVFL"));
				}
				valorflex.add(vfl);
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return valorflex;
	}

	private String getDesVFL(AtributoVO atr) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String strCod = (String) atr.getValorsugerido();
		String strCodvfl = "";
		if ((Object) strCod != null) {
			int iCodVfl = Integer.parseInt(strCod.trim());
			String query = "SELECT TCS_VALOR_FLEXIBLE.DESCRIPCION CODIGOVFL "
					+ " FROM paoyer.TCS_VALOR_FLEXIBLE "
					+ " WHERE TCS_VALOR_FLEXIBLE.CODIGO = ? ";
			try {
				pstmt = conn.prepareStatement(query);
				pstmt.setInt(1, iCodVfl);
				rst = pstmt.executeQuery();
				while (rst.next()) {
					strCodvfl = rst.getString("CODIGOVFL");
				}
			} catch (SQLException e) {
				throw new DAOException(e);
			} finally {
				close(rst, pstmt);
			}
		}
		return strCodvfl;
	}

	private int updateAtriValidarLista(Long codeSubprograma, Long codeAtri)
			throws DAOException {
		PreparedStatement pstmt = null;

		int actualizoCorrectamente;
		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET "
				+ "VALIDAR_LISTA = 'N' WHERE CODIGO = ? "
				+ "AND SBPR_CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeAtri.longValue());
			pstmt.setLong(2, codeSubprograma.longValue());
			actualizoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return actualizoCorrectamente;
	}

	// TODO: revisar bien + " UPDATE SET ? = ?, USUARIO_MODIFICA = ?,"
	public int insertBeneficiarioAtri(String strValor, String strTipodato,
			Long codeAtributo, Long codeBeneficiario, int i, String[] strArrIns)
			throws DAOException {
		PreparedStatement pstmt = null;
		String tipoAtr = "";
		String append = "";
		if (strTipodato.equalsIgnoreCase("A")
				|| strTipodato.equalsIgnoreCase("L")) {
			tipoAtr = VALOR_CAR_ATR;
			append = " UPPER(?) ";
		} else {
			if (strTipodato.equals("N")) {
				if (!strValor.equals("")) {
					tipoAtr = VALOR_NUM_ATR;
					append = " ? ";
				}
			} else {
				tipoAtr = VALOR_FEC_ATR;
				append = " TO_DATE(?,'dd/mm/rrrr'";
			}
		}
		StringBuffer query = new StringBuffer(
				"MERGE INTO TCS_BEN_BENEFICIARIO_ATRIBUTO USING DUAL "
						+ " ON (BEN_CODIGO = ? AND SAB_CODIGO = ? ) "
						+ " WHEN NOT MATCHED THEN "
						+ " INSERT (CODIGO, SAB_CODIGO, BEN_CODIGO, " + tipoAtr
						+ ", USUARIO_CREA, FECHA_CREA, TERMINAL_CREA) ");
		query.append(" VALUES(SCS_BEN_BRA.NEXTVAL, ?, ?, ?, ?, TO_DATE(sysdate,'dd/mm/RRRR'), ? ) ");
		query.append(" WHEN MATCHED THEN UPDATE ");
		query.append(" SET "
				+ tipoAtr
				+ " = "
				+ append
				+ ", USUARIO_MODIFICA = ? , FECHA_MODIFICA = TO_DATE(sysdate,'dd/mm/RRRR'), TERMINAL_MODIFICA = ?");
		System.out.println(query.toString());
		try {
			pstmt = conn.prepareStatement(query.toString());
			// parametros merge
			pstmt.setLong(1, codeBeneficiario.longValue()); // ben_codigo
			pstmt.setLong(2, codeAtributo.longValue());// sab_codigo
			// parametros insert
			pstmt.setLong(3, codeAtributo.longValue()); // sab_codigo
			pstmt.setLong(4, codeBeneficiario.longValue());// ben_codigo
			pstmt.setString(5, strValor);
			pstmt.setString(6, strArrIns[0]);// usuario_crea
			pstmt.setString(7, strArrIns[1]);// terminal_crea
			// parametros update
			pstmt.setString(8, strValor);
			pstmt.setString(9, strArrIns[0]);// usuario_modifica
			pstmt.setString(10, strArrIns[1]);// terminal_modifica
			System.out.println("1?: " + codeBeneficiario.longValue());
			System.out.println("2?: " + codeAtributo.longValue());
			System.out.println("3?: " + codeAtributo.longValue());
			System.out.println("4?: " + codeBeneficiario.longValue());
			System.out.println("5?: " + strValor);
			System.out.println("6?: " + strArrIns[0]);
			System.out.println("7?: " + strArrIns[1]);
			System.out.println("8?: " + strValor);
			System.out.println("9?: " + strArrIns[0]);
			System.out.println("10?: " + strArrIns[1]);
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public int insertBeneficioAtri(String strValor, String strTipodato,
			Long codeAtri, Long codeBot, int i, String[] strArrIns)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String queryFecha = "SELECT TO_CHAR(FECHA_BENEFICIO+?,'dd/mm/RRRR') fecha "
				+ " FROM tcs_ben_beneficio_otorgado WHERE codigo = ? ";

		String fecha;
		int bInsertoCorrectamente;
		try {
			pstmt = conn.prepareStatement(queryFecha);
			pstmt.setInt(1, i);
			pstmt.setLong(2, codeBot.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		StringBuffer query = new StringBuffer(
				"INSERT INTO TCS_BEN_BENEFICIO_ATRIBUTO (CODIGO, BOT_CODIGO, SAB_CODIGO, ");
		query.append((strTipodato.equalsIgnoreCase("A") || strTipodato
				.equalsIgnoreCase("L")) ? VALOR_CAR_ATR : (strTipodato
				.equalsIgnoreCase("N")) ? VALOR_NUM_ATR : VALOR_FEC_ATR);
		query.append(", CAMPO_F1, usuario_crea, fecha_crea, terminal_crea) ");
		query.append(" VALUES(SCS_BEN_BAT.NEXTVAL, ?, ?, ");

		// agrega la funcion para el valor en la consulta, y el valor para
		// "VALOR_CAR_ATR" o "VALOR_NUM_ATR" o
		// "VALOR_FEC_ATR" a la lista parameters2Sql con su correspondiente
		// tipo
		// de dato.
		String tipoAtr = "";
		if (strTipodato.equalsIgnoreCase("A")
				|| strTipodato.equalsIgnoreCase("L")) {
			tipoAtr = VALOR_CAR_ATR;
			query.append(" UPPER(?) ");
		} else {
			if (strTipodato.equals("N")) {
				if (!strValor.equals("")) {
					tipoAtr = VALOR_NUM_ATR;
					query.append("?");
				}
			} else {
				tipoAtr = VALOR_FEC_ATR;
				query.append("TO_DATE(?,'dd/mm/rrrr')");
			}
		}
		// CAMPO_F1, usuario_crea, fecha_crea, terminal_crea)
		query.append(", TO_DATE(?,'dd/mm/RRRR'), ?, TO_DATE(sysdate,'dd/mm/RRRR'), ?)");

		try {
			pstmt = conn.prepareStatement(query.toString());
			pstmt.setLong(1, codeBot.longValue());
			pstmt.setLong(2, codeAtri.longValue());
			if (tipoAtr.equalsIgnoreCase(VALOR_NUM_ATR)) {
				pstmt.setLong(3, Long.parseLong(strValor));
			} else {
				pstmt.setString(3, strValor);
			}
			pstmt.setString(4, fecha);// CAMPO_F1
			pstmt.setString(5, strArrIns[0]);// usuario_crea
			pstmt.setString(6, strArrIns[1]);// terminal_crea

			bInsertoCorrectamente = pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
		return bInsertoCorrectamente;
	}

	// TODO: BAD
	public int updateBeneficioAtri(String strValor, String strTipodato,
			Long codeAtri, Long codeBot, int i, String[] strArrIns)
			throws DAOException {
		PreparedStatement pstmt = null;
		CallableStatement cs = null;
		ResultSet rst = null;
		// consulta la fecha del beneficio.
		String queryFecha = "SELECT TO_CHAR(FECHA_BENEFICIO+" + i
				+ ",'dd/mm/RRRR') fecha FROM tcs_ben_beneficio_otorgado "
				+ " WHERE codigo = ? ";
		String fecha = "";
		try {
			pstmt = conn.prepareStatement(queryFecha);
			pstmt.setLong(1, codeBot);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				fecha = rst.getString("fecha");
			} else {
				fecha = "sysdate";
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}

		// construir llamada al procedimiento.
		// codeBOT, codeSAB, nameUser, terminal, dataType, valor, fecha,
		// vn_updated
		// StringBuffer query = new
		// StringBuffer("{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, ?, ?, TO_DATE(?, 'dd/mm/rrrr'), ?");

		try {
			/*
			 * if (strTipodato.equalsIgnoreCase("A") ||
			 * strTipodato.equalsIgnoreCase("L")) { String sql2 = "UPPER(''" +
			 * strValor + "'')"; // query = //
			 * "{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, ?, UPPER(?), TO_DATE(?, 'dd/mm/rrrr'), ?"
			 * ; query = "{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, ?, '" + sql2 +
			 * "', '" + "TO_DATE(''" + fecha + "'',''dd/mm/RRRR'')" + "', ?)}";
			 * } else if (strTipodato.equalsIgnoreCase("N")) { query =
			 * "{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, ?, ?, TO_DATE(?, 'dd/mm/rrrr'), ?)}"
			 * ; } else { query =
			 * "{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, ?, TO_DATE(?,'dd/mm/rrrr'), TO_DATE(?, 'dd/mm/rrrr'), ?)}"
			 * ; } System.out.println("query: " + query);
			 * System.out.println(codeBot.toString() + "," + codeAtri.toString()
			 * + "," + strArrIns[0] + "," + strArrIns[1] + "," + VALOR_CAR_ATR +
			 * "," + strValor + "," + fecha);
			 */
			String sql = "";
			String sql2 = "";
			if (strTipodato.equals("A") || strTipodato.equals("L")) {
				sql = "VALOR_CAR_ATR";
				sql2 = "upper(''" + strValor + "'')";
			} else {
				if (strTipodato.equals("N")) {
					sql = "VALOR_NUM_ATR";
					int valor = 0;
					if (!strValor.equals("")) {
						valor = Integer.parseInt(strValor.trim());
					}
					sql2 = "" + valor + "";

				} else {
					sql = "VALOR_FEC_ATR";
					sql2 = "to_date(''" + strValor + "'',''dd/mm/RRRR'')";
				}
			}

			String strSql = "{call PCS_BEN_UPDATE_BENATR(?, ?, ?, ?, '" + sql
					+ "'," + "'" + sql2 + "', 'to_date(''" + fecha
					+ "'',''dd/mm/RRRR'')', ?)}";
			System.out.println("sql: " + strSql);
			cs = conn.prepareCall(strSql);

			cs.setLong(1, codeBot);// codigo beneficio
			cs.setLong(2, codeAtri);// codigo subprgatrben
			cs.setString(3, strArrIns[0]);// nombre del usuario
			cs.setString(4, strArrIns[1]);// terminal

			cs.registerOutParameter(5, Types.INTEGER);
			cs.execute();
			int ret = cs.getInt(5);
			return ret;
			/*
			 * if (strTipodato.equalsIgnoreCase("A") ||
			 * strTipodato.equalsIgnoreCase("L")) { cs.setString(5,
			 * VALOR_CAR_ATR); cs.registerOutParameter(6, Types.INTEGER);
			 * cs.execute(); return cs.getInt(6); } else if
			 * (strTipodato.equalsIgnoreCase("N")) { cs.setString(5,
			 * VALOR_NUM_ATR); Long valor = new Long(strValor.trim());
			 * cs.setString(6, valor.toString()); cs.setString(7, fecha);
			 * cs.registerOutParameter(8, Types.INTEGER); cs.execute(); return
			 * cs.getInt(8); } else { cs.setString(5, VALOR_FEC_ATR);
			 * cs.setString(6, strValor); cs.setString(7, fecha);
			 * cs.registerOutParameter(8, Types.INTEGER); cs.execute(); return
			 * cs.getInt(8); }
			 */
		} catch (NumberFormatException e) {
			throw new DAOException("valor invalido.");
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, cs);
		}
	}

	public int insertRestriccion(String[] arr) throws DAOException {
		PreparedStatement pstmt = null;
		String query = "INSERT INTO TCS_BEN_RESTRICCION(CODIGO, DESCRIPCION, "
				+ "OPERADOR, OPERANDO1, OPERANDO2, ALERTA, VIGENCIA, CAMPO_A4, "
				+ "usuario_crea, fecha_crea, terminal_crea, "
				+ "usuario_modifica, fecha_modifica, terminal_modifica) "
				+ "VALUES(SCS_BEN_SAB.NEXTVAL,upper(?),?,?,?,?,?,?,?,to_date(?,'dd/mm/rrrr'),?,?,to_date(?,'dd/mm/rrrr'),?) ";
		List<Object> parameters = new ArrayList<Object>();
		for (int i = 0; i < arr.length; i++) {
			parameters.add(arr[i]);
		}
		try {
			pstmt = conn.prepareStatement(query);
			pstmt = setQueryParameters(pstmt, parameters);
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public int activarAtributo(Long codeSubprograma, Long codeAtri)
			throws DAOException {
		PreparedStatement pstmt = null;

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO SET VIGENCIA = 'A' "
				+ " WHERE CODIGO = ? AND SBPR_CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeAtri.longValue());
			pstmt.setLong(2, codeSubprograma.longValue());
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public int updateCampoRestAtri(Long codeSubprograma, Long codeAtri,
			Long codeMaxRest, String[] strArrAct) throws DAOException {
		PreparedStatement pstmt = null;

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " SET REST_CODIGO = ?, OBLIGATORIO = 'S', "
				+ " usuario_modifica = ?,"
				+ " fecha_modifica = TO_DATE(?,'dd/mm/rrrr'), "
				+ " terminal_modifica = ? "
				+ " WHERE CODIGO = ? AND SBPR_CODIGO = ? ";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeMaxRest.longValue());
			// USUARIO_MODIFICA
			pstmt.setString(2, strArrAct[0]);
			// FECHA_MODIFICA
			pstmt.setString(3, strArrAct[1]);
			// TERMINAL_MODIFICA
			pstmt.setString(4, strArrAct[2]);
			// CODIGO
			pstmt.setLong(5, codeAtri.longValue());
			// SBPR_CODIGO
			pstmt.setLong(6, codeSubprograma.longValue());

			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}

	public List<AtributoVO> findAtributosSAB(Long codeSubprog)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		// long sub = Long.parseLong(strSubprograma.trim());
		String strSQL;
		List<AtributoVO> listaAtriEsp = new LinkedList<AtributoVO>();

		strSQL = "SELECT ORDEN, ETIQUETA, VIGENCIA "
				+ " FROM TCS_BEN_SUBP_ATR_BENEFICIARIO WHERE SBPR_CODIGO = ? "
				+ " ORDER BY ORDEN";
		try {
			pstmt = conn.prepareStatement(strSQL);
			pstmt.setLong(1, codeSubprog.longValue());
			rst = pstmt.executeQuery();
			while (rst.next()) {
				AtributoVO a1 = new AtributoVO();
				a1.setEtiqueta(rst.getString("ETIQUETA"));
				a1.setOrden(rst.getString("ORDEN"));
				a1.setVigencia(rst.getString("VIGENCIA"));
				listaAtriEsp.add(a1);
				a1 = null;
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return listaAtriEsp;
	}

	public String findNombreAtributoSAB(Long codeAtri) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT NOMBRE, DESCRIPCION FROM TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " WHERE CODIGO = ?";
		String strName = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeAtri.longValue());
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strName = rst.getString("NOMBRE");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strName;
	}

	public String findFechaBeneficio(String strIncrement) throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT TO_CHAR(SYSDATE+?"
				+ ",'dd/mm/RRRR') fecha FROM dual ";
		String strDate = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, Integer.parseInt(strIncrement));
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strDate = rst.getString("fecha");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strDate;
	}

	public String findCodeAtributoGenerico(String nombreAtri)
			throws DAOException {
		PreparedStatement pstmt = null;
		ResultSet rst = null;

		String query = "SELECT CODIGO FROM TCS_BEN_ATR_GENERICO "
				+ " WHERE NOMBRE  = ?";
		String strCode = null;
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setString(1, nombreAtri);
			rst = pstmt.executeQuery();
			if (rst.next()) {
				strCode = rst.getString("CODIGO");
			}
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(rst, pstmt);
		}
		return strCode;
	}

	public int updateValidarLista(Long codeAtri) throws DAOException {
		PreparedStatement pstmt = null;

		String query = "UPDATE TCS_BEN_SUBP_ATR_BENEFICIARIO "
				+ " SET VALIDAR_LISTA = 'N', VALOR_SUGERIDO = '' "
				+ " WHERE CODIGO = ?";
		try {
			pstmt = conn.prepareStatement(query);
			pstmt.setLong(1, codeAtri.longValue());
			return pstmt.executeUpdate();
		} catch (SQLException e) {
			throw new DAOException(e);
		} finally {
			close(pstmt);
		}
	}
}
